package main

import (
	"fmt"
	"time"

	"github.com/glebarez/sqlite"
	"gorm.io/gorm"
)

// 初始化数据库连接
func InitDB() (*gorm.DB, error) {
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		return nil, err
	}
	// 设置数据库连接池参数
	sqlDB, err := db.DB()
	if err != nil {
		return nil, err
	}
	sqlDB.SetMaxIdleConns(10)
	sqlDB.SetMaxOpenConns(100)
	sqlDB.SetConnMaxLifetime(time.Hour)

	return db, nil
}

// 查询用户信息
func GetUsers(db *gorm.DB) ([]User, error) {
	var users []User
	// 使用缓存，减少对数据库的读操作
	err := db.Find(&users).Error
	if err != nil {
		return nil, err
	}
	return users, nil
}

// 插入用户
func InsertOneSqlite(db *gorm.DB, username string, password string) string {
	// 不存在的表会新建，实际都是新建表的方式实现的
	db.AutoMigrate(&User{})

	// 插入内容
	tx := db.Create(&User{Name: username, Password: password, Role: 1})
	if tx.Error == nil {
		return "插入成功"
	}
	return tx.Error.Error()

}

// 插入用户
func DelteOneSqlite(db *gorm.DB, username string) string {
	// 不存在的表会新建，实际都是新建表的方式实现的
	//db.AutoMigrate(&User{})
	// Delete - 删除 product（软删除）
	//db.Delete(&product, 1)
	// 硬删除
	user := User{Name: username}
	tx := db.Unscoped().Delete(&user)
	if tx.Error == nil {
		return "删除成功" + string(rune(tx.RowsAffected))
	}
	return tx.Error.Error()

}
func FindAllSqlite(username string, password string) string {
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		fmt.Printf("failed to connect database")
	}
	// 不存在的表会新建，实际都是新建表的方式实现的
	db.AutoMigrate(&User{})

	// 插入内容
	tx := db.Create(&User{Name: username, Password: password, Role: 1})
	if tx.Error == nil {
		return "插入成功"
	}
	return tx.Error.Error()

}

// https://blog.csdn.net/qq_25100257/article/details/126309025
func usesqlite() {
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		fmt.Printf("failed to connect database")
	}
	// 不存在的表会新建，实际都是新建表的方式实现的
	db.AutoMigrate(&User{})

	// 插入内容
	db.Create(&User{Name: "新款手机", Password: "D42", Role: 1})

	// 读取内容
	var product User
	db.First(&product, 1)                 // find product with integer primary key
	db.First(&product, "code = ?", "D42") // find product with code D42

	// 更新操作： 更新单个字段
	db.Model(&product).Update("Price", 2000)

	// 更新操作： 更新多个字段
	db.Model(&product).Updates(User{Name: "2000", Password: "F42"}) // non-zero fields
	db.Model(&product).Updates(map[string]interface{}{"Price": 2000, "Code": "F42"})

	// 删除操作：
	db.Delete(&product, 1)

}
